Skip to content

perf(spanner-jdbc): cache JDBC metadata query strings - #14041

Merged
rahul2393 merged 7 commits into
mainfrom
cache-metadata-queries
Aug 20, 2026
Merged

perf(spanner-jdbc): cache JDBC metadata query strings#14041
rahul2393 merged 7 commits into
mainfrom
cache-metadata-queries

Conversation

@olavloite

Copy link
Copy Markdown
Contributor

Cache the SQL strings that are loaded from disk for the standard JDBC metadata queries.

Cache the SQL strings that are loaded from disk for the standard JDBC metadata queries.
@olavloite
olavloite requested review from a team as code owners August 11, 2026 15:00

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces caching for SQL queries loaded from files in JdbcDatabaseMetaData using a ConcurrentHashMap to improve performance, and adds a corresponding unit test to verify the caching behavior. It also updates the file reading logic to use UTF-8 explicitly and adds a null check for the resource stream. The reviewer suggests managing all closeable resources (InputStream, InputStreamReader, and Scanner) within a try-with-resources block to prevent potential resource leaks and notes that BufferedReader is redundant.

@olavloite

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces caching for SQL files read from resources in JdbcDatabaseMetaData using a ConcurrentHashMap to avoid redundant file I/O operations, and adds corresponding unit tests. The review feedback suggests optimizing the cache lookup by performing a fast get check before calling computeIfAbsent to prevent unnecessary lambda allocations on cache hits.

@olavloite
olavloite force-pushed the cache-metadata-queries branch from 14ca10f to 40d5d98 Compare August 19, 2026 07:24
@olavloite olavloite added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Aug 19, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Aug 19, 2026
@olavloite

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces SQL file caching using a ConcurrentHashMap in JdbcDatabaseMetaData to optimize metadata queries, along with corresponding unit tests. It also updates the MyBatis sample tests to spin up a Spanner emulator container using Testcontainers. The review feedback suggests avoiding blocking I/O inside computeIfAbsent to prevent thread contention, removing the alwaysPull policy on the emulator container to leverage local caches, and clearing modified system properties in the test cleanup phase to ensure JVM isolation.

builder.append(line).append("\n");
}
} catch (IOException e) {
throw SpannerExceptionFactory.newSpannerException(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: earlier there was a chance of NPE, and now better

Just wanted to fyi since the PR title did not mention it

private static final String PRODUCT_NAME = "Google Cloud Spanner";
private static final String POSTGRESQL_PRODUCT_NAME = PRODUCT_NAME + " PostgreSQL";

private static final ConcurrentMap<String, String> SQL_CACHE = new ConcurrentHashMap<>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cache is unbounded but negligible risk since metadata are bounded.

@rahul2393
rahul2393 merged commit 31c628f into main Aug 20, 2026
202 checks passed
@rahul2393
rahul2393 deleted the cache-metadata-queries branch August 20, 2026 08:05
lqiu96 pushed a commit that referenced this pull request Aug 24, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>1.90.0</summary>

##
[1.90.0](v1.89.0...v1.90.0)
(2026-08-24)


### Features

* **bigquery-jdbc:** implement TypeRegistry and TypeDescriptor
([#13947](#13947))
([0557e69](0557e69))
* **bigquery:** add QueryResultsFormat and ArrowSerializationOptions
configurations
([#13942](#13942))
([ff03e19](ff03e19))
* **bigquery:** expose `StatementType` and query execution stats on
`TableResult`
([#14145](#14145))
([7d16de8](7d16de8))
* **bigtable:** enable microsecond timestamps in client
([#14057](#14057))
([57aaf8d](57aaf8d))
* **bigtable:** route single-entry MutateRows through a point-write c…
([#14028](#14028))
([a403703](a403703))
* **datastore:** add support for request tags
([#13732](#13732))
([b1f6186](b1f6186))
* **ftp:** onboard a new library
([#14068](#14068))
([f41b2d9](f41b2d9))
* **gax:** add ResumableUploadCallable and ResumableUploadCallSettings
([#14052](#14052))
([a5e26e8](a5e26e8))
* **google/cloud/biglake/hive/v1:** onboard a new library
([#14130](#14130))
([650c839](650c839))
* **google/maps/mapmanagement/v2:** onboard a new library
([#14131](#14131))
([7d00726](7d00726))
* **spanner:** support user-provided OpenTelemetry for client metrics
export
([#13741](#13741))
([da74dee](da74dee))
* update API sources and regenerate
([#14000](#14000))
([9337a93](9337a93))
* **workloadidentity:** onboard a new library
([#14060](#14060))
([ab226ee](ab226ee))


### Bug Fixes

* add documentation for insertall api that there's no default retry
([#13953](#13953))
([1fdb4f1](1fdb4f1))
* add retry behavior documentation to insertall interface to clarify the
behavior
([#14058](#14058))
([1b8f9e3](1b8f9e3))
* **auth:** fix JSpecify nullability in UserAuthorizer and TokenStore
([#14150](#14150))
([0d5fac0](0d5fac0))
* **auth:** fix remaining nullability in UserAuthorizer and Builder
([#14158](#14158))
([a51bb8d](a51bb8d))
* **auth:** refine JSpecify nullability for ServiceAccountCredentials
and UserCredentials
([#14159](#14159))
([a929250](a929250))
* **bigquery-jdbc:** enable ITOpenTelemetryTest
([#13991](#13991))
([fa6641b](fa6641b))
* **bigquery-jdbc:** pass connection proxy settings to OpenTelemetry
exporters
([#14011](#14011))
([115b9b3](115b9b3))
* **bigquery-jdbc:** session context propagation when session is enabled
([#14161](#14161))
([1e74dda](1e74dda))
* **bigtable:** remove heartbeat miss logging
([#14054](#14054))
([ec17637](ec17637))
* **deps:** update dependency
com.google.apis:google-api-services-bigquery to v2-rev20260731-2.0.0
([#14149](#14149))
([95f6c38](95f6c38))
* **deps:** update dependency com.google.cloud:libraries-bom to v26.86.0
([#14103](#14103))
([cf5697e](cf5697e))
* **gax-httpjson:** reduce Conscrypt fallback error to debug level
([#13962](#13962))
([8236771](8236771))
* **gax-httpjson:** remove unsupported and deprecated PQC named groups
([#14107](#14107))
([7604971](7604971))
* **gax:** register Conscrypt SSLContext SPI classes for GraalVM
reflection
([#14129](#14129))
([73c0243](73c0243))
* **samples:** align native profile junit and surefire versions with
shared config
([#14096](#14096))
([2b84133](2b84133))
* **spanner:** add closeAsync to ReadContext and make transaction
closing non-blocking
([#14076](#14076))
([671f892](671f892))
* **spanner:** scope server-timing metrics per call and guard
interceptor lifecycle callbacks
([#14053](#14053))
([f35c570](f35c570))
* **storage:** use JsonUtils for StorageObject serialization in
resumable writes and read channels
([#13976](#13976))
([d94922f](d94922f))


### Performance Improvements

* **bigquery-jdbc:** eliminate dry run to resolve statement type
([#14156](#14156))
([7109ecd](7109ecd))
* **spanner-jdbc:** cache commonly used query parameter names
([#14036](#14036))
([1eb6aa3](1eb6aa3))
* **spanner-jdbc:** cache JDBC metadata query strings
([#14041](#14041))
([31c628f](31c628f))
* **spanner-jdbc:** cache positional to named param conversion
([#14034](#14034))
([30e031b](30e031b))


### Dependencies

* **gax-httpjson:** upgrade conscrypt-openjdk-uber to 2.6.2
([#14117](#14117))
([2f5481a](2f5481a))
* Update gRPC to v1.82.3
([#13997](#13997))
([a786107](a786107))
* Upgrade gRPC to v1.82.4
([#14088](#14088))
([0c482fe](0c482fe))


### Documentation

* **bigquery-jdbc:** add user guide with connection property and custom
endpoint reference
([#13878](#13878))
([2dde172](2dde172))
* **gax:** update LRO troubleshooting documentation link
([#14108](#14108))
([4c5bbae](4c5bbae))
* **spanner-jdbc:** update connection_properties.md documentation
([#14035](#14035))
([b576fe8](b576fe8))
* **spanner:** update CHANGELOG.md for releases 6.117.0 through 6.120.0
([#13970](#13970))
([2413811](2413811))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants